package cn.ant.mqHandle;

import cn.ant.config.RabbitMQConfig;
import cn.ant.entity.MessageSendDTO;
import com.alibaba.fastjson2.JSONObject;
import com.rabbitmq.client.Channel;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Component;

/**
 * 消费者A和消费者B
 *
 * @author Anhui AntLaddie <a href="https://juejin.cn/user/4092805620185316">(掘金蚂蚁小哥)</a>
 * @version 1.0
 **/
@Slf4j
@Component
@RequiredArgsConstructor
public class QueueConsumer {

    /***
     * 消费者A；监听队列：queueA；设置自动确认
     */
    @RabbitListener(queues = {RabbitMQConfig.QUEUE_A}, ackMode = "AUTO")
    public void testConsumerA(@Payload String msgData, // 这个是生产者发送的JSON消息
                              Message message,
                              Channel channel) {
        log.info("接收到队列A信息......；信息为：{}",
                JSONObject.parseObject(msgData, MessageSendDTO.class));

    }

    /***
     * 消费者B；监听队列：queueB；设置自动确认
     */
    @RabbitListener(queues = {RabbitMQConfig.QUEUE_B}, ackMode = "AUTO")
    public void testConsumerB(@Payload String msgData, // 这个是生产者发送的JSON消息
                              Message message,
                              Channel channel) {
        // 注：若消费失败（报错）会自动手动不确认，并且把消息放到队列中，然后又被这个队列消费，最终死循环
        // 所以在消费消息的时候最好的方式就是手动确认，若失败则投递到死信交换机或者写入日志后直接丢弃。
        // int a = 1 / 0;
        log.info("接收到队列B信息......；信息为：{}",
                JSONObject.parseObject(msgData, MessageSendDTO.class));
    }
}
